Page Index
27 A 多租户功能
JL 于 2021-09-14 21:53:57 +08:00 修改了此页面
此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

多租户功能是基于租户共享同一个数据库、同一个表,但在表中通过tenant_id区分租户的数据的模式,基于mybatis-plus的多租户SQL解析器实现,如果对mybatis-plus不了解,请先看官方文档https://mybatis.plus/guide/interceptor-tenant-line.html

租户功能说明

  • 一个租户就是一个商城
  • 有租户约束的情况下,各租户的数据相互隔离,用户只能管理自己所属租户的数据,系统默认的admin账号属于租户1,所以admin只能管理租户1的数据比如用户管理、角色管理等,没有租户信息约束的表除外
  • 自动维护租户ID,不需要手动处理,即可实现通过租户ID 过滤的效果
  • 表中添加 tenant_id 字段
  • 在nacos相应服务的配置文件中维护这张表即可例如以下微信模块的配置文件joolun-weixin-admin-dev.yml,其他模块同理
# 租户表维护
base:
  tenant:
    column: tenant_id
    tables:
      - wx_app
      - wx_menu
      - wx_user
      - wx_auto_reply
      - wx_msg
      - wx_mass_msg

后台租户ID自动维护

  • 通过TenantContextHolderFilter拦截器,获取到token在redis中的租户ID 放到theadlocal 中

小程序端租户ID自动维护

  • 通过ThirdSessionInterceptor拦截器,获取到thirdSession在redis中的租户ID 放到theadlocal 中

无租户ID场景

  • 不需要租户信息约束的方法,在mapper的方法上添加注解旧版:@SqlParser(filter=true)新版:@InterceptorIgnore(tenantLine="true"),加上这个注解后mybatisPlus就不会在这个sql自动维护租户ID了
旧版
@SqlParser(filter=true)
SysUser getByNoTenant(SysUser sysUser);
新版
@InterceptorIgnore(tenantLine="true")
SysUser getByNoTenant(SysUser sysUser);
  • 有些没有token或thirdSession但又需要租户的场景,比如订单支付回调是不会有token和thirdSession的,所以系统不会自动维护;此时我们可以先通过回调传过来的appId,去做无租户约束的查询获取到租户ID,再手动维护进去TenantContextHolder.setTenantId

获取当前租户

TenantContextHolder.getTenantId

强制切换租户

TenantContextHolder.setTenantId

注:在增删改过程中请勿对 tenant_id字段手动赋值,不然报错

租户表维护

机构表sys_organ中parent_id为0的机构默认为一个租户

新增租户

  • 在后台【权限管理】-【租户管理】中新建租户,并配置租户管理员账号

  • 【租户管理】中给租户管理员角色赋予相应权限
  • 再用刚新增的租户管理员账号登录后台即可
  • 租户和机构是同一个表sys_organ,父级parent_id为0的机构就是一个租户,也是当前机构的最顶级
  • 拥有租户管理权限的用户就能管理租户了